home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy001 / lowlevel / mandel.asm < prev    next >
Encoding:
Assembly Source File  |  1996-11-30  |  6.0 KB  |  162 lines

  1. ;  Función "preparada" para la incorporación en una DEMO que proyecta
  2. ; en pantalla el fractal de Mandel.
  3. ;               Por NAVI Dj.
  4.  
  5. .MODEL TINY
  6. .287
  7. .CODE
  8.  
  9.                                 ORG     100h
  10. Inicio:         JMP     Main
  11.  
  12. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  13. ;-=-=-=        AREA DE DATOS DEL PROGRAMA
  14. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  15.  
  16.  X1             DQ      -0.25E1         ;  Variables que definen la ventana
  17.  X2             DQ      0.15E1          ; de visión fractal.
  18.  Y1             DQ      0.15E1
  19.  Y2             DQ      -0.15E1
  20.  
  21.  VariacionX     DQ      160E0           ;  Representan la variación de coordenadas
  22.  VariacionY     DQ      100E0           ; en el plano fractal por cada pixel.
  23.  
  24.  Estado         DW      ?               ;  Estado del copro.
  25.  aux            DQ      ?               ;  Para llevar una variable temporal.
  26.  aux2           DD      2E0             ;  Utilizada para multiplicación.
  27.  aux3           DD      4E0             ;  Utilizada para comparación.
  28.  
  29. ;-=-=-=  Variables de la ecuación imaginaria: Z=Z²+C
  30.  a              DQ      ?
  31.  b              DQ      ?
  32.  x              DQ      ?
  33.  y              DQ      ?
  34.  
  35. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  36. ;-=-=-=        AREA DE CαDIGO DEL PROGRAMA 
  37. ;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  38.  
  39. Main            PROC                    ;  Función principal.
  40.                 FLD     X2
  41.                 FSUB    X1
  42.                 FDIV    VariacionX      ;  En st(0) tenemos (X2-X1)/320.
  43.                 FSTP    VariacionX      ;  Lo guardamos en memória.
  44.  
  45.                 FLD     Y2
  46.                 FSUB    Y1
  47.                 FDIV    VariacionY      ;  En st(0) tenemos (Y2-Y1)/320.
  48.                 FSTP    VariacionY      ;  Lo guardamos en memória.
  49.  
  50.                 FLD     X1              ;  a = X1 (no es el método más
  51.                 FSTP    a               ; rápido, pero...)
  52.  
  53.                 MOV     AX, 0013h
  54.                 INT     10h             ;  Establecemos modo video 13h.
  55.  
  56.                 MOV     AX, 0A000h
  57.                 MOV     ES, AX          ;  ES contendrá "siempre" el segmento
  58.                                         ; de video.
  59.                 MOV     DX, 318d        ;  Contador de la variable NPH
  60.                 XOR     CL, CL          ;  Para acelerar el proceso.
  61.  
  62.         @BucleK:                        ;  Bucle donde se establecen las coor. horizontales.
  63.                 OR      DX, DX
  64.                 JNZ    @@BK
  65.                 JMP    @Fin
  66.                
  67.               @@BK:
  68.                 FLD     a
  69.                 FADD    VariacionX
  70.                 FSTP    a               ;  Se incrementa "a" en VariacionX.
  71.  
  72.                 FLD     Y2
  73.                 FSTP    b               ;  b = Y2
  74.  
  75.                 MOV     CH, 200d        ;  Contador de la variable NPV
  76.         
  77.         @BucleJ:                        ;  Bucle donde se establecen las coor. verticales.
  78.                 OR      CH, CH
  79.                 JNZ    @@BJ
  80.                 JMP    @SiguienteLinea
  81.               
  82.               @@BJ:
  83.                 FLD     b
  84.                 FSUB    VariacionY
  85.                 FSTP    b               ;  Se decrementa "b" en VariacionY.
  86.  
  87.                 FLDZ
  88.                 FST     x
  89.                 FSTP    y
  90.                 XOR     BX, BX          ;  x = y = BX = 0 (BX son las iteraciones).
  91.  
  92.         @BucleIteraciones:              ;  Bucle principal.
  93.                 CMP     BX, 50          ;  100 es el número máx. de iteraciones.
  94.                 JNB    @SiguientePunto  ;  Si máximas iteraciones permitidas.
  95.                 
  96.                 FLD     y
  97.                 FMUL    y
  98.                 FLD     x
  99.                 FMUL    x
  100.                 FADD    st(0), st(1)
  101.                 FSUB    aux3            ;  Le resta 4
  102.                 FTST                    ;  Comprueba si «x^2+y^2» excede de 4.
  103.                 FSTSW   Estado
  104.                 MOV     AX, Estado      ;  Ponemos en los flags la palabra de
  105.                 SAHF                    ; estado del copro.
  106.                 FFREE   st(0)           ;  Vaciamos la pila del copro.
  107.                 FFREE   st(1)
  108.                 JZ     @SiguientePunto  ;  Si el módulo es mayor que 2
  109.                 
  110.                 FLD     y
  111.                 FMUL    y
  112.                 FLD     x
  113.                 FMUL    x
  114.                 FSUB    st(0), st(1)
  115.                 FADD    a               ;  Hemos hecho: «x^2-y^2+a»
  116.                 FSTP    aux             ;  Lo guardamos en la auxiliar.
  117.                 FFREE   st(0)           ;  Vaciamos la pila del copro.
  118.  
  119.                 FLD     x
  120.                 FMUL    y
  121.                 FMUL    aux2
  122.                 FADD    b
  123.                 FSTP    y               ;  Hacemos que "y" valga «2*x*y+b»
  124.  
  125.                 FLD     aux
  126.                 FSTP    x               ;  x = aux
  127.  
  128.                 INC     BX
  129.                 JMP    @BucleIteraciones
  130.  
  131.         @SiguientePunto:
  132.  
  133.                 MOV     AX, DX
  134.                 MOV     SI, CX
  135.                 ADD     DX, CX
  136.                 SHR     CX, 1
  137.                 SHR     CX, 1
  138.                 ADD     CX, DX
  139.                 MOV     DI, CX
  140.                 MOV     BH, BL
  141.                 MOV     WORD PTR ES:[DI], BX     ;  Ponemos un punto en el sítio donde
  142.                 MOV     WORD PTR ES:[DI+320], BX ; acabamos de calcular y circundantes.
  143.                 MOV     CX, SI
  144.                 MOV     DX, AX
  145.  
  146.                 DEC     CH
  147.                 DEC     CH
  148.                 JMP    @BucleJ
  149.         
  150.         @SiguienteLinea:
  151.                 DEC     DX
  152.                 DEC     DX
  153.                 JMP    @BucleK
  154.         
  155.         @Fin:   MOV     AX, 0003h
  156. ;                INT     10h             ;  Volvemos al modo texto.
  157.                 MOV     AX, 4C00h
  158.                 INT     21h
  159.  
  160. Main            ENDP
  161.                 END     Inicio
  162.